package rdd.split;

import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;

public class Scala31_Dist_Split_2 {
    public static void main(String[] args) {
        final SparkConf conf = new SparkConf();
        conf.setMaster("local[*]");                             //我的电脑是8核，应该有8个分区
        conf.setAppName("spark");
        conf.set("spark.default.parallelism","4");              //设置分区的默认值为4

        final JavaSparkContext jsc = new JavaSparkContext(conf);
        //final JavaSparkContext jsc1 = new JavaSparkContext("local","spark");        //可以不传入spark配置对象，可以直接当作参数输入
        final JavaRDD<String> rdd = jsc.textFile("data/test.txt",4);
        /*
        rdd没有操作文件的能力，所以对文件的操作要按照Hadoop的规则进行
        hadoop划分分区尽量均分，按照字节进行
        Hadoop存储数据要保证业务的完整性，不能把完整的单词拆分存储，所以按照行读取数据、存储数据

        test1文件大小14字节，预设分区4个
        14/4=3字节，每个分区3个字节
        14/3 = 4...1=> 4+1=5，实际为5个分区
        ---------------------------------
        这里根据上面计算出每个分区为3字节，按照从0开始排序，由，后面的数减去，前面的数为3划分分区，这些数字待变偏移量，对应偏移量的数据放在分区内
        必须要按照行读取，如果0，3在第一行的偏移量中没有读取完，到了下一行，那下一行的内容必须全部都读取
        [0,3] 11    读取了0123
        [3,6] 22    读取了3456，但是7也在同一行，必须把7也读取了
        [6,9] 33    读取了6789，因为89在下一行，所以需要把1011也读取了
        [9,12] 44   读取了9101112，因为12在下一行，把13读取了，
        [12,14] 空   因为12、13都被读取了，所以没有内容可以读取了，所以为空
        ----------------------------------
        11 CR|LF    偏移量为0123
        22 CR|LF    偏移量为4567
        33 CR|LF    偏移量为891011
        44          偏移量为1213
         */
        rdd.saveAsTextFile("output");
    }
}
